-- setmetatable(_G,{
--     __newindex = function (_, n)
--         error("attempt to write to undeclared variable" .. n,2)
--     end,
--     __index = function (_, n)
--         error("attempt to read undeclared variable " .. n,2)
--     end
-- })
-- print(a)
function declare(name,initval)
    rawset(_G,name,initval or false)
end
-- declare(name,"zhangsan")
-- print(name)
-- debug.getinfo
name = 'zs'
print(_ENV.name)
--[[
    编译器在编译所有代码段前，在外层创建局部变量_ENV；
    •编译器将所有自由名称var变换为_ENV.var；
    •函数load（或函数loadfile）使用全局环境初始化代码段的第一个上值，即Lua语言内部维护的一个普通的表。实际上，这也不是太复杂。
]]
-- _ENV = nil
-- 错误
-- print(math.sin)
a = 13
local a = 12
print(a) --12(局部)
print(_ENV.a) --13(全局)
print(_G['a'])
--[[
    _ENV是一个局部变量，所有对“全局变量”的访问实际上访问的都是_ENV。
    _G则是一个在任何情况下都没有任何特殊状态的全局变量。
    按照定义，_ENV永远指向的是当前的环境；而假设在可见且无人改变过其值的前提下，
    _G通常指向的是全局环境。
    _ENV的主要用途是用来改变代码段使用的环境。一旦改变了环境，所有的全局访问就都将使用新表：
]]
a = 15
_ENV = {_G = _G}
a = 1
_G.print(_ENV.a,_G.a)
-- do
--     local _ENV = {print = print,a = 14}
--     print(a)
-- end
-- print(a)